// 启动express服务
;(async function () {
  // 引入express
  const express = require('express')
  // 引入连接
  const connect = require('./db/connect')
  // 引入model
  const model = require('./db/model')

  // 引入解析cookie的中间件
  const cookieParser = require('cookie-parser')

  // 判断是否连接成功
  try {
    await connect
    console.log('数据库连接成功')
  } catch (error) {
    return console.log('数据库连接失败', error)
  }

  // 启动express服务
  const app = express()
  // 配置中间件,处理post请求的数据
  app.use(express.urlencoded({ extended: false }))
  // 配置中间件,处理所有的静态资源
  app.use(express.static('./view'))
  // 使用操作cookie的中间件
  app.use(cookieParser())

  // 配置模板
  app.set('view engine', 'ejs') //告诉express.要使用ejs模板引擎
  app.set('views', './temp') // 告诉express. 模板存放在哪里

  // 注册
  app.post('/registe', async (req, res) => {
    // 获取用户名和密码
    // 注意: 从body中结构数据的属性,决定了浏览器上传的属性名
    const { username, password } = req.body

    // 将用户上传的信息添加到数据库中
    // 注意: 添加数据到数据库中,属性名怎么写取决于schema中定义的属性
    await model.create({ username, password })

    // 一旦注册成功,让浏览器直接访问登录页面
    res.redirect('/login.html')
  })

  // 登录
  app.post('/login', async (req, res) => {
    // 获取用户上传的用户名和密码
    const { username, password } = req.body
    // 去数据库中查看是否有这个数据
    const user = await model.findOne({ username, password })

    if (user) {
      // 告诉浏览器,把用户信息存储到cookie中
      // 这行代码其实就是在设置响应头
      res.cookie('id', user._id) //cookie有效期一个会话的时间
      // res.cookie('id', user._id, { maxAge: 1000 * 10 }) //cookie有效期10s
      // 有则代表登录成功
      res.redirect(`/home?name=${user.username}`)
    } else {
      // 没有则代表登录失败
      // 提示用户用户名或密码输入错误
      // 注意: 服务器响应给浏览器的字符串.浏览器会自动当做html去解析
      res.send(
        `用户名或密码输入错误,请重试 <a href="/login.html">登录</a>  <a href="/register.html">注册</a>`
      )
    }
  })
  // 响应home页面
  app.get('/home', async (req, res) => {
    // 判断是否有cookie,有则任务之前登录过,没有则认为没有登录
    if (req.cookies.id) {
      const { name } = req.query
      // console.log(name)
      res.render('home', { username: name })
    } else {
      res.redirect('/login.html')
    }
  })

  // 开启服务
  app.listen(5000, (err) => {
    if (err) console.log('失败', err)
    else console.log('成功')
  })
})()
